package com.cskaoyan.javase.oop1._16access._4why;
/**
 * 访问权限修饰符的作用
 * 为什么要使用访问权限修饰符?
 * 访问权限控制有点类似于给房间加锁,给房子上锁,锁上以后,在外部就无法进入(访问)
 * 但是就像锁可以被撬开一样,访问权限的控制也不是绝对安全的
 * Java本身就提供了解锁的办法——反射(reflect),反射可以破解私有权限,无视任何权限访问类中成员.
 *
 * 这样,访问权限除了控制以外,还应该具有其它含义.
 * 法律不会允许你私自撬开别人的门,所以加锁本身就具有警告的作用
 * 访问权限修饰符也是一样的, 它的作用是:
 * 告诉代码的使用者，哪些地方不要触碰，哪些地方应该使用。起到警告、约束和指导代码使用者的功能：
 *      私有化的地方,不是让你看的,你既不要用,也不要看
 *      公共的地方或者给你访问权限的地方,你应该看,应该关注,也应该使用
 *
 *      私有化的地方,私有化的代码,对于代码的开发者而已,可以对外隐藏细节,这样方便开发者修改代码.
 *      公共化的地方,对外界有权限的地方,代码的使用者应该关注.这样可以减少代码使用者使用代码的难度,直接使用,避免关注不必要的细节
 *
 *      代码开发者，可以自由的开发对外没有访问权限的代码，这些私有部分的代码，叫做隐藏代码的具体实现细节，可以很方便的修改代码实现。
 *      代码使用者无需关心没有访问权限的代码，仅需要关心具有访问权限的部分就可以了。
 *
 *      这样访问权限修饰符的使用,对大家都有好处,所以合理使用访问权限修饰符是Java面向对象的必修课,也是Java程序员的基础.
 *
 * 将一些实际的案例，最常见的：
 *      1.工具类。工具类中都是静态的方法，不需要创建对象使用，对于工具类来说，它的对象没有任意意义。
 *      ---> 于是这个类就不应该创建对象
 *      应该私有化它的构造器，禁止创建对象
 *
 *      2.类中提供给方法使用的方法，普通应该使用public修饰
 *          类中那些为了实现public方法而写的中间方法，过程方法，不需要外界有权限
 *          应该私有化它们。
 *          这样public和private一对比，就更加鲜明。
 *
 *      3.简单的设计模式
 *          a.单例模式
 *          b.工厂模式
 *              工厂的设计模式指的是不在自身类中创建自身对象
 *              而是在一个叫做"工厂"的类中创建对象
 *              利用其它类来创建这个类的对象
 *              这种情况下该类的构造器应该私有化
 *              然后在外部工厂中创建它的对象(普遍采用反射实现)
 *
 *  总结,大家可以思考一下,在给类或者类中结构加访问权限修饰时,应该遵循什么原则?
 *      应该尽量私有化,如果不能私有化,应该尽量少的给予访问权限,尽量少给public,除非确有必要.
 *
 * @since 15:19
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        A.test();
    }
}

class A{
    public static void test(){
        // 为了实现test方法，需要调用test2()方法
        test2();
    }

    // test2方法应该私有化
    // Access can be private
    private static void test2() {
        System.out.println("我是为了实现test方法的中间过程方法");
    }
}
